Описание проекта¶

Инвесторы из фонда «Shut Up and Take My Money» решили попробовать себя в новой области и открыть заведение общественного питания в Москве. Заказчики ещё не знают, что это будет за место: кафе, ресторан, пиццерия, паб или бар, — и какими будут расположение, меню и цены.

Задача — подготовить исследование рынка Москвы, найти интересные особенности и презентовать полученные результаты, которые в будущем помогут в выборе подходящего инвесторам места.

Описание данных:

  • name — название заведения;
  • address — адрес заведения;
  • category — категория заведения, например «кафе», «пиццерия» или «кофейня»;
  • hours — информация о днях и часах работы;
  • lat — широта географической точки, в которой находится заведение;
  • lng — долгота географической точки, в которой находится заведение;
  • rating — рейтинг заведения по оценкам пользователей в Яндекс Картах (высшая оценка — 5.0);
  • price — категория цен в заведении, например «средние», «ниже среднего», «выше среднего» и так далее;
  • avg_bill — строка, которая хранит среднюю стоимость заказа в виде диапазона, например: «Средний счёт: 1000–1500 ₽»; «Цена чашки капучино: 130–220 ₽»; «Цена бокала пива: 400–600 ₽». и так далее;
  • middle_avg_bill — число с оценкой среднего чека, которое указано только для значений из столбца avg_bill, начинающихся с подстроки «Средний счёт»:
    • Если в строке указан ценовой диапазон из двух значений, в столбец войдёт медиана этих двух значений.
    • Если в строке указано одно число — цена без диапазона, то в столбец войдёт это число.
    • Если значения нет или оно не начинается с подстроки «Средний счёт», то в столбец ничего не войдёт.
  • middle_coffee_cup — число с оценкой одной чашки капучино, которое указано только для значений из столбца avg_bill, начинающихся с подстроки «Цена одной чашки капучино»:
    • Если в строке указан ценовой диапазон из двух значений, в столбец войдёт медиана этих двух значений.
    • Если в строке указано одно число — цена без диапазона, то в столбец войдёт это число.
    • Если значения нет или оно не начинается с подстроки «Цена одной чашки капучино», то в столбец ничего не войдёт.
  • chain — число, выраженное 0 или 1, которое показывает, является ли заведение сетевым (для маленьких сетей могут встречаться ошибки):
    • 0 — заведение не является сетевым
    • 1 — заведение является сетевым
  • district — административный район, в котором находится заведение, например Центральный административный округ;
  • seats — количество посадочных мест.

Навыки и инструменты:

  • Pandas
  • Plotly
  • Python
  • Seaborn
  • визуализация данных

Загрузка и изучение данных¶

Загрузка данных¶

In [1]:
import pandas as pd
import seaborn as sb
import numpy as np
import json
import plotly.express as px
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import matplotlib.pyplot as plt
from plotly.subplots import make_subplots
import folium

from folium import Map, Choropleth
from folium import Map, Marker
from folium.plugins import MarkerCluster
from folium.features import CustomIcon

%config InlineBackend.figure_format = 'retina'
sb.set_palette('pastel') 
In [2]:
try:
    data = pd.read_csv('/datasets/moscow_places.csv', sep=',') 
except:
    data = pd.read_csv('https://code.s3.yandex.net//datasets/moscow_places.csv', sep=',') 
In [3]:
data
Out[3]:
name category address district hours lat lng rating price avg_bill middle_avg_bill middle_coffee_cup chain seats
0 WoWфли кафе Москва, улица Дыбенко, 7/1 Северный административный округ ежедневно, 10:00–22:00 55.878494 37.478860 5.0 NaN NaN NaN NaN 0 NaN
1 Четыре комнаты ресторан Москва, улица Дыбенко, 36, корп. 1 Северный административный округ ежедневно, 10:00–22:00 55.875801 37.484479 4.5 выше среднего Средний счёт:1500–1600 ₽ 1550.0 NaN 0 4.0
2 Хазри кафе Москва, Клязьминская улица, 15 Северный административный округ пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... 55.889146 37.525901 4.6 средние Средний счёт:от 1000 ₽ 1000.0 NaN 0 45.0
3 Dormouse Coffee Shop кофейня Москва, улица Маршала Федоренко, 12 Северный административный округ ежедневно, 09:00–22:00 55.881608 37.488860 5.0 NaN Цена чашки капучино:155–185 ₽ NaN 170.0 0 NaN
4 Иль Марко пиццерия Москва, Правобережная улица, 1Б Северный административный округ ежедневно, 10:00–22:00 55.881166 37.449357 5.0 средние Средний счёт:400–600 ₽ 500.0 NaN 1 148.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
8401 Суши Мания кафе Москва, Профсоюзная улица, 56 Юго-Западный административный округ ежедневно, 09:00–02:00 55.670021 37.552480 4.4 NaN NaN NaN NaN 0 86.0
8402 Миславнес кафе Москва, Пролетарский проспект, 19, корп. 1 Южный административный округ ежедневно, 08:00–22:00 55.640875 37.656553 4.8 NaN NaN NaN NaN 0 150.0
8403 Самовар кафе Москва, Люблинская улица, 112А, стр. 1 Юго-Восточный административный округ ежедневно, круглосуточно 55.648859 37.743219 3.9 NaN Средний счёт:от 150 ₽ 150.0 NaN 0 150.0
8404 Чайхана Sabr кафе Москва, Люблинская улица, 112А, стр. 1 Юго-Восточный административный округ ежедневно, круглосуточно 55.648849 37.743222 4.2 NaN NaN NaN NaN 1 150.0
8405 Kebab Time кафе Москва, Россошанский проезд, 6 Южный административный округ ежедневно, круглосуточно 55.598229 37.604702 3.9 NaN NaN NaN NaN 0 12.0

8406 rows × 14 columns

Изучение данных¶

In [4]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8406 entries, 0 to 8405
Data columns (total 14 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   name               8406 non-null   object 
 1   category           8406 non-null   object 
 2   address            8406 non-null   object 
 3   district           8406 non-null   object 
 4   hours              7870 non-null   object 
 5   lat                8406 non-null   float64
 6   lng                8406 non-null   float64
 7   rating             8406 non-null   float64
 8   price              3315 non-null   object 
 9   avg_bill           3816 non-null   object 
 10  middle_avg_bill    3149 non-null   float64
 11  middle_coffee_cup  535 non-null    float64
 12  chain              8406 non-null   int64  
 13  seats              4795 non-null   float64
dtypes: float64(6), int64(1), object(7)
memory usage: 919.5+ KB

Мы видим, что всего в датасете 8406 строк, но есть пропуски в некоторых столбцах, их мы изучим далее. Также далее изменим типы данных в некоторых столбцах для удобства исследования.

In [5]:
data.hist(figsize=(10, 8));

По гистограммам, мы видим, что в данных есть выбросы, далее изучим их.

Предобработка данных¶

Пропуски данных¶

In [6]:
data.isna().sum()
Out[6]:
name                    0
category                0
address                 0
district                0
hours                 536
lat                     0
lng                     0
rating                  0
price                5091
avg_bill             4590
middle_avg_bill      5257
middle_coffee_cup    7871
chain                   0
seats                3611
dtype: int64

Видим, что в столбцах hours,price,avg_bill,middle_avg_bill,middle_coffee_cup,seats` есть пропуски. Посмотрим на каждый столбец поближе.

In [7]:
data['hours'].unique()
Out[7]:
array(['ежедневно, 10:00–22:00',
       'пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00–02:00',
       'ежедневно, 09:00–22:00', ...,
       'пн-пт 08:30–21:30; сб,вс 09:00–21:30',
       'пн-чт 13:00–22:00; пт,сб 13:00–22:30; вс 13:00–22:00',
       'пн-сб 10:30–21:30'], dtype=object)

Пропуски в этом столбце нельзя заполнить числовыми значениями, так как все данные в столбце типа object и все заведения имеют свой график работы.

In [8]:
data['price'].unique()
Out[8]:
array([nan, 'выше среднего', 'средние', 'высокие', 'низкие'], dtype=object)

В этом столбце мы имеем категориальные данные, всего пропусков 5091 записей, что довольно много. Так как числовыми значениями мы заполнить не можем, оставим пропуски как есть.

In [9]:
data['avg_bill'].unique()
Out[9]:
array([nan, 'Средний счёт:1500–1600 ₽', 'Средний счёт:от 1000 ₽',
       'Цена чашки капучино:155–185 ₽', 'Средний счёт:400–600 ₽',
       'Средний счёт:199 ₽', 'Средний счёт:200–300 ₽',
       'Средний счёт:от 500 ₽', 'Средний счёт:1000–1200 ₽',
       'Цена бокала пива:250–350 ₽', 'Средний счёт:330 ₽',
       'Средний счёт:1500 ₽', 'Средний счёт:300–500 ₽',
       'Средний счёт:140–350 ₽', 'Средний счёт:350–500 ₽',
       'Средний счёт:300–1500 ₽', 'Средний счёт:от 240 ₽',
       'Средний счёт:200–250 ₽', 'Средний счёт:328 ₽',
       'Средний счёт:300 ₽', 'Средний счёт:от 345 ₽',
       'Средний счёт:60–400 ₽', 'Средний счёт:900 ₽',
       'Средний счёт:500–800 ₽', 'Средний счёт:500–1000 ₽',
       'Средний счёт:600–700 ₽', 'Цена бокала пива:120–350 ₽',
       'Средний счёт:1000–1500 ₽', 'Средний счёт:1500–2000 ₽',
       'Цена чашки капучино:150–190 ₽', 'Средний счёт:2000–2500 ₽',
       'Средний счёт:600 ₽', 'Средний счёт:450 ₽',
       'Цена чашки капучино:120–170 ₽', 'Средний счёт:100–500 ₽',
       'Средний счёт:от 850 ₽', 'Цена чашки капучино:100–200 ₽',
       'Средний счёт:250–600 ₽', 'Средний счёт:2100 ₽',
       'Средний счёт:349 ₽', 'Цена бокала пива:90–230 ₽',
       'Цена чашки капучино:150–210 ₽', 'Средний счёт:150–250 ₽',
       'Средний счёт:от 120 ₽', 'Цена чашки капучино:80–160 ₽',
       'Средний счёт:269 ₽', 'Средний счёт:600–2000 ₽',
       'Средний счёт:700–800 ₽', 'Средний счёт:500–700 ₽',
       'Средний счёт:300–2000 ₽', 'Средний счёт:355 ₽',
       'Средний счёт:от 200 ₽', 'Средний счёт:800–1200 ₽',
       'Средний счёт:150–300 ₽', 'Средний счёт:300–700 ₽',
       'Средний счёт:250–300 ₽', 'Средний счёт:1200 ₽',
       'Цена чашки капучино:100 ₽', 'Цена чашки капучино:239–274 ₽',
       'Средний счёт:390–460 ₽', 'Средний счёт:700–1500 ₽',
       'Средний счёт:800–1000 ₽', 'Средний счёт:700–1000 ₽',
       'Средний счёт:240 ₽', 'Средний счёт:1000 ₽',
       'Средний счёт:350–800 ₽', 'Средний счёт:1200–1800 ₽',
       'Средний счёт:350 ₽', 'Средний счёт:от 700 ₽',
       'Средний счёт:69–499 ₽', 'Цена чашки капучино:130–190 ₽',
       'Цена бокала пива:160–499 ₽', 'Средний счёт:200–350 ₽',
       'Средний счёт:100–200 ₽', 'Средний счёт:362 ₽',
       'Средний счёт:150–500 ₽', 'Средний счёт:2000 ₽',
       'Средний счёт:291 ₽', 'Средний счёт:260–300 ₽',
       'Средний счёт:250–400 ₽', 'Средний счёт:1500–3000 ₽',
       'Средний счёт:2500–3000 ₽', 'Средний счёт:от 1500 ₽',
       'Средний счёт:400–500 ₽', 'Средний счёт:350–550 ₽',
       'Средний счёт:1000–2000 ₽', 'Средний счёт:1200–1600 ₽',
       'Средний счёт:2000–3000 ₽', 'Цена чашки капучино:200–300 ₽',
       'Средний счёт:500 ₽', 'Средний счёт:1800–2500 ₽',
       'Средний счёт:900–1100 ₽', 'Средний счёт:4500–5500 ₽',
       'Средний счёт:700–1300 ₽', 'Цена чашки капучино:150–180 ₽',
       'Средний счёт:650–1000 ₽', 'Средний счёт:от 350 ₽',
       'Средний счёт:250–1000 ₽', 'Средний счёт:2500 ₽',
       'Цена чашки капучино:119–179 ₽', 'Средний счёт:300–350 ₽',
       'Средний счёт:300–600 ₽', 'Средний счёт:1500–5000 ₽',
       'Средний счёт:1500–2500 ₽', 'Средний счёт:1000–1300 ₽',
       'Цена чашки капучино:100–170 ₽', 'Средний счёт:600–750 ₽',
       'Средний счёт:150–350 ₽', 'Средний счёт:200–400 ₽',
       'Цена чашки капучино:200–240 ₽', 'Средний счёт:350–1000 ₽',
       'Средний счёт:450–500 ₽', 'Средний счёт:1500–1880 ₽',
       'Средний счёт:350–1500 ₽', 'Средний счёт:700 ₽',
       'Средний счёт:800–1300 ₽', 'Средний счёт:250–430 ₽',
       'Цена чашки капучино:150–200 ₽', 'Средний счёт:до 1000 ₽',
       'Средний счёт:600–1300 ₽', 'Цена бокала пива:199–300 ₽',
       'Цена бокала пива:от 140 ₽', 'Цена бокала пива:от 149 ₽',
       'Цена бокала пива:150–450 ₽', 'Средний счёт:900–1150 ₽',
       'Средний счёт:321 ₽', 'Средний счёт:300–800 ₽',
       'Средний счёт:500–1500 ₽', 'Средний счёт:200–450 ₽',
       'Цена чашки капучино:150–240 ₽', 'Средний счёт:360–540 ₽',
       'Средний счёт:280–420 ₽', 'Средний счёт:360 ₽',
       'Средний счёт:350–400 ₽', 'Средний счёт:250–500 ₽',
       'Средний счёт:317 ₽', 'Средний счёт:250–350 ₽',
       'Средний счёт:до 650 ₽', 'Средний счёт:324 ₽',
       'Цена чашки капучино:от 60 ₽', 'Средний счёт:300–400 ₽',
       'Средний счёт:343 ₽', 'Средний счёт:120–160 ₽',
       'Цена чашки капучино:120–180 ₽', 'Средний счёт:120 ₽',
       'Цена чашки капучино:179–249 ₽', 'Средний счёт:200–360 ₽',
       'Средний счёт:300–450 ₽', 'Цена чашки капучино:75 ₽',
       'Цена чашки капучино:от 89 ₽', 'Средний счёт:280–320 ₽',
       'Цена чашки капучино:90–100 ₽', 'Средний счёт:240–360 ₽',
       'Цена чашки капучино:149–259 ₽', 'Средний счёт:от 300 ₽',
       'Средний счёт:30–300 ₽', 'Средний счёт:195–235 ₽',
       'Средний счёт:от 549 ₽', 'Цена чашки капучино:120 ₽',
       'Средний счёт:160–240 ₽', 'Средний счёт:320–480 ₽',
       'Средний счёт:50–300 ₽', 'Средний счёт:313 ₽',
       'Цена чашки капучино:от 90 ₽', 'Цена чашки капучино:110–170 ₽',
       'Цена чашки капучино:105–145 ₽', 'Средний счёт:300–1000 ₽',
       'Цена чашки капучино:155–170 ₽', 'Цена чашки капучино:130–180 ₽',
       'Средний счёт:250–450 ₽', 'Цена чашки капучино:129–179 ₽',
       'Цена чашки капучино:110–200 ₽', 'Средний счёт:260–400 ₽',
       'Средний счёт:400–1000 ₽', 'Средний счёт:350–2400 ₽',
       'Цена чашки капучино:285–310 ₽', 'Цена чашки капучино:110–190 ₽',
       'Средний счёт:60–140 ₽', 'Цена чашки капучино:190–220 ₽',
       'Средний счёт:140–160 ₽', 'Средний счёт:750–1200 ₽',
       'Цена чашки капучино:100–180 ₽', 'Средний счёт:5000–17000 ₽',
       'Цена чашки капучино:98–150 ₽', 'Средний счёт:250 ₽',
       'Средний счёт:от 800 ₽', 'Средний счёт:120–470 ₽',
       'Средний счёт:850–1100 ₽', 'Средний счёт:3500–4000 ₽',
       'Средний счёт:1200–1500 ₽', 'Средний счёт:до 300 ₽',
       'Цена чашки капучино:150–250 ₽', 'Средний счёт:от 2000 ₽',
       'Средний счёт:1400–1600 ₽', 'Средний счёт:360–500 ₽',
       'Средний счёт:100–160 ₽', 'Средний счёт:450–600 ₽',
       'Средний счёт:800 ₽', 'Цена чашки капучино:140–200 ₽',
       'Цена чашки капучино:160–220 ₽', 'Средний счёт:344 ₽',
       'Средний счёт:400–800 ₽', 'Цена бокала пива:130–150 ₽',
       'Цена чашки капучино:60–180 ₽', 'Средний счёт:150–220 ₽',
       'Средний счёт:100–700 ₽', 'Средний счёт:700–1100 ₽',
       'Цена чашки капучино:99–169 ₽', 'Цена чашки капучино:99–180 ₽',
       'Средний счёт:900–1000 ₽', 'Средний счёт:120–370 ₽',
       'Средний счёт:от 1800 ₽', 'Средний счёт:750–1000 ₽',
       'Средний счёт:199–450 ₽', 'Цена чашки капучино:285–289 ₽',
       'Цена чашки капучино:90–160 ₽', 'Средний счёт:480 ₽',
       'Средний счёт:390–1000 ₽', 'Средний счёт:150–200 ₽',
       'Цена чашки капучино:200–250 ₽', 'Средний счёт:1800 ₽',
       'Цена чашки капучино:210–250 ₽', 'Цена чашки капучино:от 200 ₽',
       'Средний счёт:100–180 ₽', 'Цена чашки капучино:200–275 ₽',
       'Средний счёт:200 ₽', 'Цена чашки капучино:230–350 ₽',
       'Средний счёт:100–423 ₽', 'Средний счёт:400–2500 ₽',
       'Средний счёт:350–450 ₽', 'Цена чашки капучино:239–269 ₽',
       'Цена чашки капучино:100–179 ₽', 'Средний счёт:400 ₽',
       'Средний счёт:800–1500 ₽', 'Цена чашки капучино:140–220 ₽',
       'Средний счёт:750–900 ₽', 'Цена чашки капучино:249–309 ₽',
       'Цена бокала пива:220–350 ₽', 'Средний счёт:3000 ₽',
       'Средний счёт:800–2000 ₽', 'Средний счёт:160–200 ₽',
       'Средний счёт:500–600 ₽', 'Средний счёт:600–900 ₽',
       'Средний счёт:404 ₽', 'Средний счёт:200–500 ₽',
       'Средний счёт:170–300 ₽', 'Средний счёт:366 ₽',
       'Средний счёт:304 ₽', 'Средний счёт:4000–5000 ₽',
       'Средний счёт:275 ₽', 'Средний счёт:520–600 ₽',
       'Средний счёт:200–600 ₽', 'Средний счёт:до 470 ₽',
       'Средний счёт:275–500 ₽', 'Цена чашки капучино:130–170 ₽',
       'Средний счёт:550–1500 ₽', 'Цена чашки капучино:150–290 ₽',
       'Цена бокала пива:180–330 ₽', 'Средний счёт:700–3000 ₽',
       'Средний счёт:800–3000 ₽', 'Средний счёт:от 340 ₽',
       'Средний счёт:250–380 ₽', 'Средний счёт:500–1200 ₽',
       'Средний счёт:363 ₽', 'Средний счёт:100–350 ₽',
       'Средний счёт:250–270 ₽', 'Средний счёт:2900 ₽',
       'Цена чашки капучино:109–169 ₽', 'Средний счёт:80–340 ₽',
       'Цена чашки капучино:149–199 ₽', 'Цена чашки капучино:170–220 ₽',
       'Средний счёт:80–300 ₽', 'Средний счёт:900–1200 ₽',
       'Средний счёт:650–850 ₽', 'Средний счёт:750–850 ₽',
       'Средний счёт:850–1200 ₽', 'Средний счёт:2200 ₽',
       'Цена бокала пива:220–550 ₽', 'Цена чашки капучино:от 139 ₽',
       'Цена бокала пива:150–290 ₽', 'Средний счёт:99–500 ₽',
       'Средний счёт:от 250 ₽', 'Цена чашки капучино:120–150 ₽',
       'Средний счёт:1500–1800 ₽', 'Средний счёт:600–1000 ₽',
       'Средний счёт:1400 ₽', 'Цена чашки капучино:159–200 ₽',
       'Средний счёт:150–180 ₽', 'Цена чашки капучино:250–340 ₽',
       'Средний счёт:426 ₽', 'Средний счёт:400–650 ₽',
       'Средний счёт:100–300 ₽', 'Средний счёт:850–1500 ₽',
       'Средний счёт:3500–5000 ₽', 'Цена чашки капучино:220–270 ₽',
       'Цена чашки капучино:60–150 ₽', 'Средний счёт:250–480 ₽',
       'Средний счёт:800–1100 ₽', 'Цена чашки капучино:235–335 ₽',
       'Цена чашки капучино:99–179 ₽', 'Средний счёт:260–1000 ₽',
       'Средний счёт:1300–2500 ₽', 'Цена бокала пива:320–440 ₽',
       'Цена чашки капучино:220–320 ₽', 'Средний счёт:320 ₽',
       'Средний счёт:1300–1500 ₽', 'Цена чашки капучино:69–99 ₽',
       'Средний счёт:до 1500 ₽', 'Цена чашки капучино:от 205 ₽',
       'Цена чашки капучино:80–175 ₽', 'Цена чашки капучино:95 ₽',
       'Цена чашки капучино:60–120 ₽', 'Средний счёт:205–500 ₽',
       'Цена чашки капучино:60–100 ₽', 'Средний счёт:260–280 ₽',
       'Цена чашки капучино:140–190 ₽', 'Цена чашки капучино:75–150 ₽',
       'Средний счёт:2000–3500 ₽', 'Цена чашки капучино:150–220 ₽',
       'Средний счёт:550 ₽', 'Цена бокала пива:370–410 ₽',
       'Цена чашки капучино:130–250 ₽', 'Цена бокала пива:320–460 ₽',
       'Цена чашки капучино:120–190 ₽', 'Средний счёт:500–650 ₽',
       'Средний счёт:250–700 ₽', 'Средний счёт:500–550 ₽',
       'Средний счёт:600–800 ₽', 'Средний счёт:600–1200 ₽',
       'Средний счёт:700–1200 ₽', 'Цена чашки капучино:170–190 ₽',
       'Цена бокала пива:180–420 ₽', 'Средний счёт:1300–1700 ₽',
       'Средний счёт:300–650 ₽', 'Средний счёт:от 1200 ₽',
       'Средний счёт:от 390 ₽', 'Средний счёт:от 2500 ₽',
       'Средний счёт:230–250 ₽', 'Средний счёт:260–290 ₽',
       'Средний счёт:1400–1700 ₽', 'Цена бокала пива:280 ₽',
       'Средний счёт:100–2000 ₽', 'Цена чашки капучино:190–230 ₽',
       'Средний счёт:от 180 ₽', 'Средний счёт:500–750 ₽',
       'Цена бокала пива:150–350 ₽', 'Средний счёт:1100–1500 ₽',
       'Средний счёт:400–1500 ₽', 'Средний счёт:700–850 ₽',
       'Цена чашки капучино:180–200 ₽', 'Цена чашки капучино:до 179 ₽',
       'Цена чашки капучино:300–350 ₽', 'Цена чашки капучино:89–229 ₽',
       'Средний счёт:1200–2000 ₽', 'Цена бокала пива:270–390 ₽',
       'Средний счёт:3000–4000 ₽', 'Средний счёт:500–2000 ₽',
       'Средний счёт:443 ₽', 'Средний счёт:340–550 ₽',
       'Цена чашки капучино:159 ₽', 'Средний счёт:229 ₽',
       'Цена чашки капучино:180–250 ₽', 'Цена чашки капучино:195–295 ₽',
       'Цена бокала пива:200–440 ₽', 'Средний счёт:700–900 ₽',
       'Средний счёт:150–600 ₽', 'Средний счёт:2500–3500 ₽',
       'Средний счёт:до 350 ₽', 'Средний счёт:3000–3500 ₽',
       'Цена бокала пива:380–400 ₽', 'Средний счёт:1200–3000 ₽',
       'Средний счёт:700–1400 ₽', 'Цена бокала пива:260–380 ₽',
       'Средний счёт:280–290 ₽', 'Цена чашки капучино:70–150 ₽',
       'Средний счёт:2500–4000 ₽', 'Средний счёт:400–1200 ₽',
       'Цена чашки капучино:90–240 ₽', 'Средний счёт:375 ₽',
       'Цена бокала пива:200–300 ₽', 'Цена чашки капучино:249–284 ₽',
       'Цена бокала пива:от 350 ₽', 'Цена чашки капучино:от 150 ₽',
       'Средний счёт:от 50 ₽', 'Цена чашки капучино:199–285 ₽',
       'Цена чашки капучино:110–165 ₽', 'Средний счёт:500–1300 ₽',
       'Цена чашки капучино:230–280 ₽', 'Цена чашки капучино:180–300 ₽',
       'Цена чашки капучино:120–160 ₽', 'Средний счёт:35–300 ₽',
       'Средний счёт:150–650 ₽', 'Средний счёт:290–500 ₽',
       'Цена бокала пива:от 200 ₽', 'Средний счёт:650–800 ₽',
       'Цена бокала пива:100–250 ₽', 'Средний счёт:330–400 ₽',
       'Средний счёт:320–350 ₽', 'Цена чашки капучино:85–350 ₽',
       'Средний счёт:650 ₽', 'Цена чашки капучино:280–350 ₽',
       'Цена чашки капучино:от 170 ₽', 'Средний счёт:1000–2500 ₽',
       'Средний счёт:950–1200 ₽', 'Средний счёт:500–2500 ₽',
       'Средний счёт:795–1325 ₽', 'Средний счёт:1200–1300 ₽',
       'Цена чашки капучино:от 230 ₽', 'Цена чашки капучино:100–160 ₽',
       'Средний счёт:170–350 ₽', 'Цена чашки капучино:120–200 ₽',
       'Средний счёт:750–1500 ₽', 'Цена чашки капучино:120–215 ₽',
       'Средний счёт:232–387 ₽', 'Цена бокала пива:от 195 ₽',
       'Цена чашки капучино:220–280 ₽', 'Средний счёт:330–990 ₽',
       'Цена бокала пива:240–380 ₽', 'Средний счёт:150 ₽',
       'Средний счёт:400–900 ₽', 'Средний счёт:220–350 ₽',
       'Цена бокала пива:160–350 ₽', 'Средний счёт:70–150 ₽',
       'Цена чашки капучино:от 169 ₽', 'Средний счёт:495 ₽',
       'Цена чашки капучино:185–285 ₽', 'Цена чашки капучино:170–250 ₽',
       'Средний счёт:35–100 ₽', 'Средний счёт:500–900 ₽',
       'Цена чашки капучино:130–230 ₽', 'Средний счёт:450–550 ₽',
       'Средний счёт:230–280 ₽', 'Цена бокала пива:300 ₽',
       'Цена чашки капучино:100–140 ₽', 'Средний счёт:от 270 ₽',
       'Цена бокала пива:200–390 ₽', 'Средний счёт:350–700 ₽',
       'Средний счёт:400–700 ₽', 'Средний счёт:280 ₽',
       'Средний счёт:60–180 ₽', 'Средний счёт:383 ₽',
       'Цена чашки капучино:90–180 ₽', 'Цена чашки капучино:от 110 ₽',
       'Средний счёт:391 ₽', 'Средний счёт:от 320 ₽',
       'Цена чашки капучино:119–149 ₽', 'Цена чашки капучино:130 ₽',
       'Цена чашки капучино:200 ₽', 'Средний счёт:700–3500 ₽',
       'Цена чашки капучино:100–120 ₽', 'Средний счёт:500–3000 ₽',
       'Цена чашки капучино:250 ₽', 'Цена бокала пива:180–260 ₽',
       'Средний счёт:407 ₽', 'Средний счёт:170–490 ₽',
       'Цена бокала пива:90–250 ₽', 'Средний счёт:49–369 ₽',
       'Средний счёт:50–200 ₽', 'Средний счёт:270–350 ₽',
       'Средний счёт:422 ₽', 'Цена чашки капучино:130–160 ₽',
       'Цена чашки капучино:110–150 ₽', 'Цена чашки капучино:100–150 ₽',
       'Цена чашки капучино:от 130 ₽', 'Цена чашки капучино:60–300 ₽',
       'Средний счёт:415 ₽', 'Средний счёт:150–450 ₽',
       'Средний счёт:500–1100 ₽', 'Средний счёт:250–550 ₽',
       'Цена бокала пива:300–400 ₽', 'Средний счёт:190–280 ₽',
       'Средний счёт:1000–10000 ₽', 'Цена бокала пива:от 100 ₽',
       'Средний счёт:450–900 ₽', 'Средний счёт:432 ₽',
       'Цена чашки капучино:90–150 ₽', 'Цена бокала пива:200–350 ₽',
       'Средний счёт:350–600 ₽', 'Средний счёт:465 ₽',
       'Цена чашки капучино:230–2907 ₽', 'Средний счёт:90–450 ₽',
       'Средний счёт:299–450 ₽', 'Средний счёт:149–249 ₽',
       'Цена чашки капучино:145–225 ₽', 'Средний счёт:412 ₽',
       'Средний счёт:270–400 ₽', 'Цена чашки капучино:59–99 ₽',
       'Средний счёт:5000–5500 ₽', 'Цена чашки капучино:250–270 ₽',
       'Цена чашки капучино:120–140 ₽', 'Средний счёт:280–350 ₽',
       'Средний счёт:550–750 ₽', 'Средний счёт:от 150 ₽',
       'Средний счёт:400–450 ₽', 'Средний счёт:385 ₽',
       'Средний счёт:1900–2500 ₽', 'Средний счёт:170–280 ₽',
       'Средний счёт:400–550 ₽', 'Цена чашки капучино:250–350 ₽',
       'Средний счёт:130–200 ₽', 'Цена чашки капучино:195 ₽',
       'Цена чашки капучино:250–290 ₽', 'Средний счёт:300–420 ₽',
       'Средний счёт:950–1500 ₽', 'Средний счёт:170–700 ₽',
       'Цена чашки капучино:от 270 ₽', 'Средний счёт:180–350 ₽',
       'Средний счёт:1300–1800 ₽', 'Цена бокала пива:220–450 ₽',
       'Цена чашки капучино:284–299 ₽', 'Цена бокала пива:330–490 ₽',
       'Цена чашки капучино:от 250 ₽', 'Средний счёт:550–1300 ₽',
       'Цена бокала пива:420–640 ₽', 'Средний счёт:382 ₽',
       'Средний счёт:от 399 ₽', 'Цена чашки капучино:90–158 ₽',
       'Цена чашки капучино:140–180 ₽', 'Средний счёт:620 ₽',
       'Цена чашки капучино:от 120 ₽', 'Цена чашки капучино:230–290 ₽',
       'Цена чашки капучино:200–350 ₽', 'Средний счёт:411 ₽',
       'Средний счёт:50–250 ₽', 'Средний счёт:150–400 ₽',
       'Средний счёт:340 ₽', 'Средний счёт:от 175 ₽',
       'Средний счёт:7000 ₽', 'Цена бокала пива:270–1100 ₽',
       'Цена бокала пива:370–420 ₽', 'Средний счёт:2500–4500 ₽',
       'Средний счёт:3000–5000 ₽', 'Средний счёт:от 5000 ₽',
       'Цена бокала пива:300–475 ₽', 'Цена бокала пива:260–360 ₽',
       'Средний счёт:6000–8000 ₽', 'Цена бокала пива:200–240 ₽',
       'Цена чашки капучино:до 150 ₽', 'Средний счёт:1500–1900 ₽',
       'Средний счёт:5000–8000 ₽', 'Цена бокала пива:199–459 ₽',
       'Цена бокала пива:220–390 ₽', 'Средний счёт:280–450 ₽',
       'Цена бокала пива:350–400 ₽', 'Цена бокала пива:390–590 ₽',
       'Цена чашки капучино:250–300 ₽', 'Цена бокала пива:390 ₽',
       'Средний счёт:350–650 ₽', 'Цена чашки капучино:220–250 ₽',
       'Цена чашки капучино:180–210 ₽', 'Средний счёт:1300–2000 ₽',
       'Средний счёт:5500 ₽', 'Средний счёт:2300 ₽',
       'Цена чашки капучино:270 ₽', 'Цена бокала пива:220–440 ₽',
       'Средний счёт:1000–1700 ₽', 'Цена чашки капучино:160–180 ₽',
       'Средний счёт:320–1500 ₽', 'Средний счёт:от 420 ₽',
       'Средний счёт:1000–3000 ₽', 'Средний счёт:от 0 ₽',
       'Цена чашки капучино:200–220 ₽', 'Средний счёт:800–1800 ₽',
       'Средний счёт:3500 ₽', 'Цена чашки капучино:80–150 ₽',
       'Цена бокала пива:290–440 ₽', 'Средний счёт:2500–5000 ₽',
       'Цена чашки капучино:279–378 ₽', 'Средний счёт:1300 ₽',
       'Средний счёт:2400 ₽', 'Средний счёт:180–280 ₽',
       'Цена бокала пива:300–600 ₽', 'Средний счёт:300–550 ₽',
       'Цена бокала пива:150–250 ₽', 'Средний счёт:1400–1800 ₽',
       'Цена чашки капучино:195–245 ₽', 'Средний счёт:900–1400 ₽',
       'Средний счёт:190–290 ₽', 'Цена бокала пива:190–500 ₽',
       'Цена чашки капучино:230–320 ₽', 'Средний счёт:1500–3500 ₽',
       'Средний счёт:7000–7500 ₽', 'Средний счёт:1300–1600 ₽',
       'Средний счёт:1700–2500 ₽', 'Средний счёт:6000 ₽',
       'Средний счёт:5000 ₽', 'Средний счёт:80–350 ₽',
       'Средний счёт:от 600 ₽', 'Средний счёт:1800–2000 ₽',
       'Средний счёт:1000–1100 ₽', 'Средний счёт:2000–5000 ₽',
       'Средний счёт:1200–2500 ₽', 'Средний счёт:130–700 ₽',
       'Цена чашки капучино:115–140 ₽', 'Цена бокала пива:250–490 ₽',
       'Средний счёт:900–1500 ₽', 'Цена бокала пива:240–350 ₽',
       'Средний счёт:1200–1900 ₽', 'Средний счёт:1700 ₽',
       'Средний счёт:250–280 ₽', 'Цена бокала пива:200–1100 ₽',
       'Средний счёт:4000 ₽', 'Средний счёт:2600 ₽',
       'Средний счёт:1330 ₽', 'Средний счёт:1900 ₽',
       'Цена чашки капучино:90–99 ₽', 'Цена чашки капучино:160–350 ₽',
       'Цена бокала пива:300–500 ₽', 'Средний счёт:590–1490 ₽',
       'Средний счёт:280–400 ₽', 'Цена чашки капучино:50–150 ₽',
       'Средний счёт:1–2000 ₽', 'Цена чашки капучино:250–280 ₽',
       'Средний счёт:1500–1700 ₽', 'Средний счёт:220 ₽',
       'Средний счёт:от 475 ₽', 'Цена чашки капучино:205–245 ₽',
       'Средний счёт:от 470 ₽', 'Цена бокала пива:88–460 ₽',
       'Средний счёт:400–6000 ₽', 'Цена чашки капучино:270–280 ₽',
       'Средний счёт:от 1400 ₽', 'Цена чашки капучино:150–219 ₽',
       'Средний счёт:230–500 ₽', 'Средний счёт:650–2000 ₽',
       'Средний счёт:от 3500 ₽', 'Цена бокала пива:170–380 ₽',
       'Средний счёт:260 ₽', 'Цена бокала пива:250–400 ₽',
       'Средний счёт:от 4000 ₽', 'Средний счёт:600–950 ₽',
       'Средний счёт:270–300 ₽', 'Цена бокала пива:260–400 ₽',
       'Цена чашки капучино:от 180 ₽', 'Цена бокала пива:250–450 ₽',
       'Средний счёт:240–350 ₽', 'Цена чашки капучино:170–230 ₽',
       'Цена бокала пива:200–380 ₽', 'Цена бокала пива:350 ₽',
       'Средний счёт:150–260 ₽', 'Средний счёт:от 330 ₽',
       'Цена бокала пива:320–380 ₽', 'Цена чашки капучино:от 100 ₽',
       'Цена бокала пива:340–420 ₽', 'Средний счёт:230–650 ₽',
       'Средний счёт:380–400 ₽', 'Цена бокала пива:129–319 ₽',
       'Цена чашки капучино:160–210 ₽', 'Цена чашки капучино:300 ₽',
       'Цена чашки капучино:90–130 ₽', 'Средний счёт:1200–1700 ₽',
       'Средний счёт:от 3000 ₽', 'Цена чашки капучино:170–210 ₽',
       'Цена чашки капучино:220 ₽', 'Цена бокала пива:320–470 ₽',
       'Цена чашки капучино:250–330 ₽', 'Средний счёт:160–500 ₽',
       'Средний счёт:150–700 ₽', 'Цена бокала пива:до 350 ₽',
       'Цена чашки капучино:от 300 ₽', 'Средний счёт:700–1800 ₽',
       'Цена бокала пива:290–390 ₽', 'Цена бокала пива:350–500 ₽',
       'Цена бокала пива:270–490 ₽', 'Средний счёт:1400–1500 ₽',
       'Цена чашки капучино:190–240 ₽', 'Цена чашки капучино:189–269 ₽',
       'Цена бокала пива:230–350 ₽', 'Средний счёт:250–800 ₽',
       'Цена чашки капучино:120–250 ₽', 'Средний счёт:250–320 ₽',
       'Средний счёт:от 400 ₽', 'Средний счёт:1000–1600 ₽',
       'Цена чашки капучино:99–200 ₽', 'Цена бокала пива:180–380 ₽',
       'Цена чашки капучино:130–210 ₽', 'Средний счёт:290–490 ₽',
       'Цена бокала пива:340 ₽', 'Цена бокала пива:300–420 ₽',
       'Средний счёт:100–400 ₽', 'Средний счёт:190–350 ₽',
       'Средний счёт:600–1500 ₽', 'Средний счёт:350–2000 ₽',
       'Цена чашки капучино:170–200 ₽', 'Цена чашки капучино:139–189 ₽',
       'Цена бокала пива:150–180 ₽', 'Средний счёт:390–500 ₽',
       'Средний счёт:450–700 ₽', 'Цена чашки капучино:149–219 ₽',
       'Средний счёт:301 ₽', 'Цена чашки капучино:180–230 ₽',
       'Цена бокала пива:190–350 ₽', 'Средний счёт:180–220 ₽',
       'Цена чашки капучино:220–240 ₽', 'Цена чашки капучино:145–200 ₽',
       'Цена бокала пива:320–375 ₽', 'Средний счёт:380–500 ₽',
       'Цена чашки капучино:239–279 ₽', 'Средний счёт:270–450 ₽',
       'Средний счёт:240–500 ₽', 'Средний счёт:1600 ₽',
       'Средний счёт:850–1000 ₽', 'Цена бокала пива:155–465 ₽',
       'Цена чашки капучино:190–250 ₽', 'Цена бокала пива:280–400 ₽',
       'Средний счёт:до 500 ₽', 'Средний счёт:433 ₽',
       'Цена чашки капучино:220–350 ₽', 'Средний счёт:1300–2100 ₽',
       'Цена чашки капучино:179–314 ₽', 'Средний счёт:90–190 ₽',
       'Средний счёт:150–1000 ₽', 'Цена чашки капучино:275 ₽',
       'Средний счёт:4500–5000 ₽', 'Цена чашки капучино:179–219 ₽',
       'Цена бокала пива:360 ₽', 'Цена чашки капучино:140–170 ₽',
       'Средний счёт:1000–1350 ₽', 'Цена бокала пива:250–395 ₽',
       'Цена чашки капучино:160–200 ₽', 'Цена чашки капучино:90–110 ₽',
       'Цена бокала пива:170–320 ₽', 'Средний счёт:2000–4000 ₽',
       'Цена чашки капучино:90–98 ₽', 'Цена чашки капучино:128–148 ₽',
       'Цена чашки капучино:90–170 ₽', 'Средний счёт:339 ₽',
       'Средний счёт:5000–15000 ₽', 'Средний счёт:470 ₽',
       'Цена чашки капучино:250–500 ₽', 'Средний счёт:200–220 ₽',
       'Средний счёт:410 ₽', 'Средний счёт:370 ₽', 'Средний счёт:285 ₽',
       'Средний счёт:220–270 ₽', 'Средний счёт:200–1000 ₽',
       'Цена бокала пива:150 ₽', 'Средний счёт:190–260 ₽',
       'Цена бокала пива:200–320 ₽', 'Средний счёт:508 ₽',
       'Средний счёт:438 ₽', 'Цена чашки капучино:89–209 ₽',
       'Цена чашки капучино:120–210 ₽', 'Цена чашки капучино:184–194 ₽',
       'Средний счёт:472 ₽', 'Средний счёт:350–420 ₽',
       'Средний счёт:310–370 ₽', 'Цена чашки капучино:230–250 ₽',
       'Цена бокала пива:250–390 ₽', 'Средний счёт:550–1550 ₽',
       'Средний счёт:1000–1400 ₽', 'Цена чашки капучино:199–229 ₽',
       'Цена чашки капучино:250–390 ₽', 'Средний счёт:670 ₽',
       'Цена бокала пива:190–450 ₽', 'Средний счёт:280–330 ₽',
       'Средний счёт:230–350 ₽', 'Цена чашки капучино:220–330 ₽',
       'Цена бокала пива:150–230 ₽', 'Цена бокала пива:180–480 ₽',
       'Средний счёт:от 450 ₽', 'Средний счёт:290 ₽',
       'Цена бокала пива:190–430 ₽', 'Цена чашки капучино:90–250 ₽',
       'Цена чашки капучино:240 ₽', 'Цена бокала пива:250–550 ₽',
       'Средний счёт:170–230 ₽', 'Средний счёт:450–800 ₽',
       'Средний счёт:1500–4000 ₽', 'Цена чашки капучино:150–245 ₽',
       'Средний счёт:420–680 ₽', 'Средний счёт:441 ₽',
       'Цена чашки капучино:160–270 ₽', 'Средний счёт:230–300 ₽',
       'Средний счёт:80–220 ₽', 'Средний счёт:390–700 ₽',
       'Цена чашки капучино:190–245 ₽', 'Средний счёт:от 100 ₽',
       'Средний счёт:450–650 ₽', 'Цена бокала пива:180–400 ₽',
       'Цена чашки капучино:90–140 ₽', 'Средний счёт:550–700 ₽',
       'Средний счёт:300–430 ₽', 'Цена бокала пива:220–500 ₽',
       'Средний счёт:1700–1900 ₽', 'Средний счёт:520–1200 ₽',
       'Средний счёт:434 ₽', 'Средний счёт:150–599 ₽',
       'Средний счёт:90 ₽', 'Средний счёт:от 499 ₽',
       'Цена бокала пива:140–190 ₽', 'Средний счёт:390–660 ₽',
       'Средний счёт:503 ₽', 'Средний счёт:от 1090 ₽',
       'Цена бокала пива:230 ₽', 'Средний счёт:850 ₽',
       'Средний счёт:100–599 ₽', 'Средний счёт:130–350 ₽',
       'Средний счёт:499–700 ₽', 'Средний счёт:100 ₽',
       'Средний счёт:373 ₽', 'Средний счёт:385–580 ₽',
       'Цена чашки капучино:145–185 ₽', 'Средний счёт:380–600 ₽',
       'Цена чашки капучино:210–290 ₽', 'Средний счёт:220–500 ₽',
       'Средний счёт:90–230 ₽', 'Средний счёт:120–150 ₽',
       'Цена чашки капучино:179–275 ₽', 'Цена чашки капучино:95–159 ₽',
       'Цена чашки капучино:200–260 ₽', 'Средний счёт:392 ₽',
       'Цена чашки капучино:65–140 ₽', 'Средний счёт:430 ₽',
       'Цена чашки капучино:от 160 ₽', 'Цена чашки капучино:150 ₽',
       'Средний счёт:110–200 ₽', 'Цена чашки капучино:110–160 ₽',
       'Средний счёт:130–140 ₽', 'Средний счёт:190 ₽',
       'Цена бокала пива:140–420 ₽', 'Средний счёт:299 ₽',
       'Средний счёт:402 ₽', 'Цена чашки капучино:129–169 ₽',
       'Цена чашки капучино:160–250 ₽', 'Средний счёт:20000–50000 ₽',
       'Цена чашки капучино:130–150 ₽', 'Цена чашки капучино:89–149 ₽',
       'Средний счёт:435 ₽', 'Средний счёт:270 ₽',
       'Цена бокала пива:280–360 ₽', 'Цена бокала пива:350–370 ₽',
       'Средний счёт:от 199 ₽', 'Средний счёт:50 ₽', 'Средний счёт:453 ₽',
       'Цена бокала пива:170–240 ₽', 'Цена чашки капучино:60–90 ₽',
       'Средний счёт:750 ₽', 'Средний счёт:1000–5000 ₽',
       'Средний счёт:500–5000 ₽', 'Средний счёт:160–250 ₽',
       'Средний счёт:439 ₽', 'Средний счёт:от 30 ₽',
       'Средний счёт:170–220 ₽', 'Средний счёт:298 ₽',
       'Цена бокала пива:170–200 ₽', 'Средний счёт:500–520 ₽',
       'Цена бокала пива:39–190 ₽', 'Средний счёт:100–270 ₽',
       'Средний счёт:299–400 ₽', 'Цена чашки капучино:119–169 ₽',
       'Средний счёт:416 ₽', 'Цена чашки капучино:205–280 ₽',
       'Цена чашки капучино:140–160 ₽', 'Цена чашки капучино:110 ₽',
       'Средний счёт:266 ₽', 'Цена бокала пива:200 ₽',
       'Цена чашки капучино:от 129 ₽', 'Средний счёт:140–250 ₽',
       'Цена бокала пива:140–330 ₽', 'Средний счёт:170 ₽',
       'Средний счёт:140–142 ₽', 'Средний счёт:372 ₽',
       'Средний счёт:200–700 ₽', 'Средний счёт:475 ₽',
       'Средний счёт:100–1000 ₽', 'Средний счёт:413 ₽',
       'Средний счёт:450–750 ₽', 'Средний счёт:от 140 ₽',
       'Средний счёт:100–330 ₽', 'Цена бокала пива:390–530 ₽',
       'Средний счёт:от 650 ₽', 'Цена чашки капучино:150–320 ₽',
       'Средний счёт:200–280 ₽', 'Средний счёт:200–270 ₽',
       'Цена бокала пива:280–410 ₽', 'Цена бокала пива:190–390 ₽',
       'Цена бокала пива:220–250 ₽', 'Цена чашки капучино:170–239 ₽',
       'Средний счёт:35–180 ₽', 'Средний счёт:220–300 ₽',
       'Средний счёт:от 165 ₽', 'Цена чашки капучино:100–210 ₽',
       'Средний счёт:от 230 ₽', 'Средний счёт:380–1010 ₽',
       'Средний счёт:280–360 ₽', 'Средний счёт:500–1050 ₽',
       'Средний счёт:180 ₽', 'Цена чашки капучино:80–240 ₽',
       'Средний счёт:300–1600 ₽', 'Средний счёт:70–200 ₽',
       'Цена чашки капучино:160–230 ₽', 'Средний счёт:180–1170 ₽',
       'Цена бокала пива:160–390 ₽', 'Средний счёт:120–130 ₽',
       'Цена чашки капучино:120–220 ₽', 'Цена чашки капучино:100–220 ₽',
       'Цена чашки капучино:80–120 ₽'], dtype=object)

Опять же данные категориальные, можно бло заменить на средние или медианные значения, но среднее значение зависит от многих факторов: удаленность от центра, стоимость блюд и многое другое. Оставим пока пропуски, как есть.

In [10]:
data['middle_avg_bill'].unique()
Out[10]:
array([      nan, 1.550e+03, 1.000e+03, 5.000e+02, 1.990e+02, 2.500e+02,
       1.100e+03, 3.300e+02, 1.500e+03, 4.000e+02, 2.450e+02, 4.250e+02,
       9.000e+02, 2.400e+02, 2.250e+02, 3.280e+02, 3.000e+02, 3.450e+02,
       2.300e+02, 6.500e+02, 7.500e+02, 1.250e+03, 1.750e+03, 2.250e+03,
       6.000e+02, 4.500e+02, 8.500e+02, 2.100e+03, 3.490e+02, 2.000e+02,
       1.200e+02, 2.690e+02, 1.300e+03, 1.150e+03, 3.550e+02, 2.750e+02,
       1.200e+03, 5.750e+02, 3.500e+02, 7.000e+02, 2.840e+02, 1.500e+02,
       3.620e+02, 3.250e+02, 2.000e+03, 2.910e+02, 2.800e+02, 2.750e+03,
       1.400e+03, 2.500e+03, 2.150e+03, 5.000e+03, 8.250e+02, 6.250e+02,
       3.250e+03, 6.750e+02, 4.750e+02, 1.690e+03, 9.250e+02, 1.050e+03,
       3.400e+02, 9.500e+02, 1.025e+03, 3.210e+02, 5.500e+02, 3.600e+02,
       3.750e+02, 3.170e+02, 3.240e+02, 3.430e+02, 1.400e+02, 1.650e+02,
       2.150e+02, 5.490e+02, 1.750e+02, 3.130e+02, 1.375e+03, 1.000e+02,
       9.750e+02, 1.100e+04, 8.000e+02, 2.950e+02, 3.750e+03, 1.350e+03,
       4.300e+02, 1.300e+02, 5.250e+02, 3.440e+02, 1.850e+02, 1.800e+03,
       8.750e+02, 4.800e+02, 6.950e+02, 2.610e+02, 1.450e+03, 3.000e+03,
       1.800e+02, 4.040e+02, 2.350e+02, 3.660e+02, 3.040e+02, 4.500e+03,
       5.600e+02, 4.700e+02, 3.870e+02, 1.850e+03, 1.900e+03, 3.150e+02,
       3.630e+02, 2.600e+02, 2.900e+03, 2.100e+02, 1.900e+02, 2.200e+03,
       2.990e+02, 1.650e+03, 4.260e+02, 1.175e+03, 4.250e+03, 3.650e+02,
       6.300e+02, 3.200e+02, 3.520e+02, 2.700e+02, 3.900e+02, 7.750e+02,
       1.600e+03, 3.500e+03, 4.430e+02, 4.450e+02, 2.290e+02, 2.850e+02,
       5.000e+01, 1.670e+02, 3.950e+02, 7.250e+02, 3.350e+02, 1.075e+03,
       1.060e+03, 1.125e+03, 3.090e+02, 6.600e+02, 1.100e+02, 4.950e+02,
       6.700e+01, 2.550e+02, 3.830e+02, 3.910e+02, 4.070e+02, 2.090e+02,
       1.250e+02, 3.100e+02, 4.220e+02, 4.150e+02, 5.500e+03, 4.320e+02,
       4.650e+02, 3.740e+02, 4.120e+02, 5.250e+03, 3.850e+02, 1.225e+03,
       4.350e+02, 2.650e+02, 3.820e+02, 3.990e+02, 6.200e+02, 4.110e+02,
       7.000e+03, 4.000e+03, 1.700e+03, 6.500e+03, 2.300e+03, 9.100e+02,
       4.200e+02, 0.000e+00, 2.400e+03, 7.250e+03, 6.000e+03, 2.600e+03,
       1.330e+03, 1.040e+03, 2.200e+02, 3.200e+03, 1.325e+03, 2.050e+02,
       4.400e+02, 3.010e+02, 3.700e+02, 4.330e+02, 4.750e+03, 3.390e+02,
       1.000e+04, 4.100e+02, 5.080e+02, 4.380e+02, 4.720e+02, 6.700e+02,
       3.050e+02, 2.900e+02, 4.410e+02, 5.450e+02, 8.600e+02, 4.340e+02,
       9.000e+01, 4.990e+02, 5.030e+02, 1.090e+03, 5.990e+02, 3.730e+02,
       4.820e+02, 4.900e+02, 1.600e+02, 1.350e+02, 3.920e+02, 1.550e+02,
       4.020e+02, 3.500e+04, 4.530e+02, 4.390e+02, 3.000e+01, 1.950e+02,
       2.980e+02, 5.100e+02, 4.160e+02, 2.660e+02, 1.700e+02, 1.410e+02,
       3.720e+02, 4.130e+02, 1.070e+02])

Здесь данные уже количественные, но из-за пропусков в других данных, это пропуски будет сложно заполнить верными значениями.Оставим пропуски как есть.

In [11]:
data['middle_coffee_cup'].unique()
Out[11]:
array([  nan,  170.,  145.,  150.,  180.,  120.,  100.,  256.,  160.,
        250.,  165.,  149.,  135.,  220.,  175.,  195.,   60.,  214.,
         75.,   89.,   95.,  204.,   90.,  140.,  125.,  162.,  155.,
        154.,  297.,  205.,  124.,  200.,  190.,  134.,  139.,  287.,
        225.,  230.,  237.,  290.,  254.,  279.,  174.,  179.,  295.,
        245.,  105.,  285.,  270.,   84.,  127.,   80.,  112.,  185.,
        210.,  325.,  159.,  215.,  110.,  266.,  242.,  137.,  255.,
        240.,  217.,  315.,  130.,  167.,  169.,  235., 1568.,   79.,
        260.,  300.,  291.,  275.,  115.,  328.,   94.,  265.,  184.,
        229.,  164.,  172.,  259.,  246.,  199.,  138.,  375.,  189.,
        320.,  197.,  227.,  102.,  119.,  144.,  129.])

Также логически верными значениями сложно заполнить пропуски, оставим пропуски.

In [12]:
data['seats'].unique()
Out[12]:
array([      nan, 4.000e+00, 4.500e+01, 1.480e+02, 7.900e+01, 6.500e+01,
       1.020e+02, 1.800e+02, 9.600e+01, 2.500e+01, 4.600e+01, 4.000e+01,
       2.470e+02, 2.100e+01, 8.000e+00, 3.500e+01, 2.400e+02, 8.500e+01,
       1.200e+01, 6.000e+01, 1.200e+02, 1.600e+01, 8.000e+01, 5.000e+01,
       4.400e+01, 4.300e+01, 9.000e+01, 0.000e+00, 1.980e+02, 9.500e+01,
       3.500e+02, 1.240e+02, 1.000e+01, 7.000e+01, 4.800e+01, 6.000e+00,
       9.800e+01, 3.000e+01, 5.200e+01, 2.000e+01, 2.000e+00, 1.800e+01,
       2.200e+01, 1.500e+01, 2.800e+01, 3.000e+02, 7.500e+01, 3.200e+01,
       1.000e+02, 1.100e+02, 2.300e+02, 2.500e+02, 1.300e+02, 8.400e+01,
       3.980e+02, 2.700e+01, 2.860e+02, 1.450e+02, 3.600e+01, 9.700e+01,
       2.260e+02, 1.400e+02, 1.660e+02, 2.020e+02, 9.400e+01, 1.890e+02,
       5.300e+01, 1.040e+02, 7.200e+01, 1.310e+02, 1.050e+02, 5.500e+01,
       1.700e+01, 1.000e+00, 1.150e+02, 3.100e+02, 7.700e+01, 1.600e+02,
       3.200e+02, 3.400e+01, 1.500e+02, 2.000e+02, 1.070e+02, 2.600e+01,
       2.400e+01, 4.900e+01, 2.200e+02, 1.250e+02, 7.000e+00, 5.000e+02,
       2.100e+02, 2.250e+02, 2.730e+02, 1.060e+02, 1.120e+02, 1.760e+02,
       6.900e+01, 2.290e+02, 6.200e+01, 9.000e+00, 2.390e+02, 2.460e+02,
       4.200e+01, 1.880e+02, 1.740e+02, 1.400e+01, 7.600e+01, 2.320e+02,
       6.800e+01, 6.250e+02, 8.300e+01, 9.200e+01, 1.280e+02, 2.450e+02,
       5.800e+01, 6.700e+01, 8.200e+01, 3.000e+00, 6.300e+01, 3.800e+01,
       5.600e+01, 1.900e+02, 4.700e+01, 6.100e+01, 3.070e+02, 1.380e+02,
       2.170e+02, 6.400e+01, 7.800e+01, 5.000e+00, 3.430e+02, 1.470e+02,
       8.800e+01, 8.600e+01, 7.400e+01, 4.200e+02, 1.700e+02, 1.320e+02,
       9.300e+01, 3.260e+02, 1.260e+02, 1.430e+02, 2.900e+01, 2.520e+02,
       4.810e+02, 5.400e+01, 2.120e+02, 1.670e+02, 3.560e+02, 1.900e+01,
       8.700e+01, 3.700e+01, 1.040e+03, 6.600e+02, 8.100e+01, 1.780e+02,
       1.640e+02, 2.760e+02, 1.840e+02, 1.920e+02, 2.800e+02, 4.100e+01,
       1.870e+02, 1.750e+02, 1.130e+02, 2.700e+02, 1.850e+02, 4.000e+02,
       4.800e+02, 1.440e+02, 2.870e+02, 1.540e+02, 3.080e+02, 1.270e+02,
       4.780e+02, 3.900e+01, 2.360e+02, 1.180e+02, 9.200e+02, 1.200e+03,
       1.510e+02, 2.150e+02, 1.550e+02, 1.580e+02, 3.800e+02, 1.350e+02,
       1.650e+02, 5.100e+01, 6.600e+01, 2.140e+02, 3.060e+02, 1.080e+02,
       2.660e+02, 1.610e+02, 1.460e+02, 2.950e+02, 4.300e+02, 1.330e+02,
       1.950e+02, 5.850e+02, 1.160e+02, 7.600e+02, 6.500e+02, 9.900e+01,
       1.220e+02, 4.910e+02, 2.900e+02, 3.300e+02, 6.000e+02, 4.550e+02,
       4.500e+02, 1.680e+02, 1.288e+03, 1.410e+02, 6.440e+02, 4.950e+02,
       2.750e+02, 2.280e+02, 1.590e+02, 1.570e+02, 4.280e+02, 1.300e+01,
       2.680e+02, 2.080e+02, 1.140e+02, 3.300e+01, 6.750e+02, 2.060e+02,
       1.730e+02, 3.050e+02])

Значения количественные, заменим на 0.

In [13]:
data['seats']=data['seats'].fillna(0)

Также как и в предыдущем столбце, среднее кол-во будет сложно заполнить верными даннымм,оставим пропуски.

In [14]:
data.isna().sum()
Out[14]:
name                    0
category                0
address                 0
district                0
hours                 536
lat                     0
lng                     0
rating                  0
price                5091
avg_bill             4590
middle_avg_bill      5257
middle_coffee_cup    7871
chain                   0
seats                   0
dtype: int64

Изменение типов данных¶

In [15]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8406 entries, 0 to 8405
Data columns (total 14 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   name               8406 non-null   object 
 1   category           8406 non-null   object 
 2   address            8406 non-null   object 
 3   district           8406 non-null   object 
 4   hours              7870 non-null   object 
 5   lat                8406 non-null   float64
 6   lng                8406 non-null   float64
 7   rating             8406 non-null   float64
 8   price              3315 non-null   object 
 9   avg_bill           3816 non-null   object 
 10  middle_avg_bill    3149 non-null   float64
 11  middle_coffee_cup  535 non-null    float64
 12  chain              8406 non-null   int64  
 13  seats              8406 non-null   float64
dtypes: float64(6), int64(1), object(7)
memory usage: 919.5+ KB

Заменим типы данных на целое число.

In [16]:
data['seats'] = data['seats'].astype(int)

Поиск дубликатов¶

Проверим на неявные дубликаты.

In [17]:
data.duplicated().sum()
Out[17]:
0

На первый взгляд дубликатов нет, но посмотрим поближе на столбец с названиями заведений.

Приведем названия к нижнему регистру

In [18]:
data['name']=data['name'].str.lower()
In [19]:
data.duplicated(subset=['name','address','lat']).sum()
Out[19]:
1
In [20]:
data[data.duplicated(subset=['name','address','lat'],keep=False)]
Out[20]:
name category address district hours lat lng rating price avg_bill middle_avg_bill middle_coffee_cup chain seats
1430 more poke ресторан Москва, Волоколамское шоссе, 11, стр. 2 Северный административный округ ежедневно, 09:00–21:00 55.806307 37.497566 4.2 NaN NaN NaN NaN 0 188
1511 more poke ресторан Москва, Волоколамское шоссе, 11, стр. 2 Северный административный округ пн-чт 09:00–18:00; пт,сб 09:00–21:00; вс 09:00... 55.806307 37.497566 4.2 NaN NaN NaN NaN 1 188

Мы нашли дубликат, удалим его.

In [21]:
data.drop_duplicates(subset=['name','address','lat'],keep=False,inplace=True)
In [22]:
data.duplicated(subset=['name','address','lat']).sum() # Дубликат удален
Out[22]:
0

Столбец street с названиями улиц.¶

Создайте столбец street с названиями улиц из столбца с адресом.

In [23]:
data['address'].unique()
Out[23]:
array(['Москва, улица Дыбенко, 7/1', 'Москва, улица Дыбенко, 36, корп. 1',
       'Москва, Клязьминская улица, 15', ...,
       'Москва, улица Лобачевского, 52, корп. 1',
       'Москва, Болотниковская улица, 52, корп. 2',
       'Москва, Чонгарский бульвар, 26А, корп. 1'], dtype=object)

Добавим столбец

In [24]:
data['street'] = data['address'].str.split(', ').str[1]
In [25]:
data.head(5)
Out[25]:
name category address district hours lat lng rating price avg_bill middle_avg_bill middle_coffee_cup chain seats street
0 wowфли кафе Москва, улица Дыбенко, 7/1 Северный административный округ ежедневно, 10:00–22:00 55.878494 37.478860 5.0 NaN NaN NaN NaN 0 0 улица Дыбенко
1 четыре комнаты ресторан Москва, улица Дыбенко, 36, корп. 1 Северный административный округ ежедневно, 10:00–22:00 55.875801 37.484479 4.5 выше среднего Средний счёт:1500–1600 ₽ 1550.0 NaN 0 4 улица Дыбенко
2 хазри кафе Москва, Клязьминская улица, 15 Северный административный округ пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... 55.889146 37.525901 4.6 средние Средний счёт:от 1000 ₽ 1000.0 NaN 0 45 Клязьминская улица
3 dormouse coffee shop кофейня Москва, улица Маршала Федоренко, 12 Северный административный округ ежедневно, 09:00–22:00 55.881608 37.488860 5.0 NaN Цена чашки капучино:155–185 ₽ NaN 170.0 0 0 улица Маршала Федоренко
4 иль марко пиццерия Москва, Правобережная улица, 1Б Северный административный округ ежедневно, 10:00–22:00 55.881166 37.449357 5.0 средние Средний счёт:400–600 ₽ 500.0 NaN 1 148 Правобережная улица

Столбец is_24/7¶

Создайте столбец is_24/7 с обозначением, что заведение работает ежедневно и круглосуточно (24/7):

  • логическое значение True — если заведение работает ежедневно и круглосуточно;
  • логическое значение False — в противоположном случае.
In [26]:
data['is_24/7'] = data['hours'].str.contains('ежедневно, круглосуточно')
In [27]:
data.head(5)
Out[27]:
name category address district hours lat lng rating price avg_bill middle_avg_bill middle_coffee_cup chain seats street is_24/7
0 wowфли кафе Москва, улица Дыбенко, 7/1 Северный административный округ ежедневно, 10:00–22:00 55.878494 37.478860 5.0 NaN NaN NaN NaN 0 0 улица Дыбенко False
1 четыре комнаты ресторан Москва, улица Дыбенко, 36, корп. 1 Северный административный округ ежедневно, 10:00–22:00 55.875801 37.484479 4.5 выше среднего Средний счёт:1500–1600 ₽ 1550.0 NaN 0 4 улица Дыбенко False
2 хазри кафе Москва, Клязьминская улица, 15 Северный административный округ пн-чт 11:00–02:00; пт,сб 11:00–05:00; вс 11:00... 55.889146 37.525901 4.6 средние Средний счёт:от 1000 ₽ 1000.0 NaN 0 45 Клязьминская улица False
3 dormouse coffee shop кофейня Москва, улица Маршала Федоренко, 12 Северный административный округ ежедневно, 09:00–22:00 55.881608 37.488860 5.0 NaN Цена чашки капучино:155–185 ₽ NaN 170.0 0 0 улица Маршала Федоренко False
4 иль марко пиццерия Москва, Правобережная улица, 1Б Северный административный округ ежедневно, 10:00–22:00 55.881166 37.449357 5.0 средние Средний счёт:400–600 ₽ 500.0 NaN 1 148 Правобережная улица False

Анализ данных¶

Категории заведений в данных¶

Какие категории заведений представлены в данных? Исследуйте количество объектов общественного питания по категориям: рестораны, кофейни, пиццерии, бары и так далее. Постройте визуализации. Ответьте на вопрос о распределении заведений по категориям.

In [28]:
estab=data.groupby('category')['name'].count().reset_index(name='count').sort_values(by='count',ascending=False)
estab
Out[28]:
category count
3 кафе 2378
6 ресторан 2041
4 кофейня 1413
0 бар,паб 765
5 пиццерия 633
2 быстрое питание 603
7 столовая 315
1 булочная 256
In [29]:
fig = px.bar(estab, x='category', y='count')
fig.update_xaxes(tickangle=45)
fig.update_layout(title='Кол-во объектов по категориям',
                   xaxis_title='Категории заведений',
                   yaxis_title='Кол-во объектов')
fig.show() 

По графику мы видим, что больше всего в данных заведений категории "Кафе" и "Ресторан" и "Кофейня", меньше всего заведений категорий "Столовая" и "Булочная".

Количество посадочных мест в местах по категориям.¶

Исследуйте количество посадочных мест в местах по категориям: рестораны, кофейни, пиццерии, бары и так далее. Постройте визуализации. Проанализируйте результаты и сделайте выводы.

In [30]:
data.groupby('category')['seats'].describe().sort_values(by='mean',ascending=False)
Out[30]:
count mean std min 25% 50% 75% max
category
бар,паб 765.0 76.184314 128.615244 0.0 0.0 40.0 95.0 1288.0
ресторан 2041.0 75.694757 114.095357 0.0 0.0 42.0 100.0 1288.0
пиццерия 633.0 63.744076 102.281061 0.0 0.0 30.0 80.0 1288.0
кофейня 1413.0 59.101911 108.451675 0.0 0.0 6.0 82.0 1288.0
быстрое питание 603.0 57.235489 94.649647 0.0 0.0 10.0 81.5 1040.0
столовая 315.0 51.933333 101.678800 0.0 0.0 6.0 80.0 1200.0
булочная 256.0 51.675781 86.355582 0.0 0.0 9.0 70.5 625.0
кафе 2378.0 49.945332 97.487915 0.0 0.0 0.0 60.0 1288.0

По общей информации мы видим, что больше всего в среднем посадочных мест в заведениях категорий "Ресторан" и "Бар, паб", меньше всего мест в "Кафе". Однако, стандартное отклонение во всех категориях высокое, что говорит о присутствии выборосов, посмотрим на графике подробнее.

In [31]:
fig=sb.boxplot(x=data['category'],y=data['seats']).set(title = 'Кол-во посадочных мест по категориям', xlabel = 'Категории заведений', ylabel = ('Кол-во посадочных мест'));
plt.xticks(rotation=45)
plt.show()

Как и предпогалась, на графике мы видим много выбросов. Рассчитаем персентиль, чтобы отсечь выбросы.

In [32]:
np.percentile(data['seats'],[95,99])
Out[32]:
array([250. , 490.7])
In [33]:
(data['seats']<= 490).mean() # Выбросов выше 490 посадочных мест меньше 1%, можем удалить их
Out[33]:
0.9898857686815802
In [34]:
data=data.query('seats <= 490')
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 8319 entries, 0 to 8405
Data columns (total 16 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   name               8319 non-null   object 
 1   category           8319 non-null   object 
 2   address            8319 non-null   object 
 3   district           8319 non-null   object 
 4   hours              7792 non-null   object 
 5   lat                8319 non-null   float64
 6   lng                8319 non-null   float64
 7   rating             8319 non-null   float64
 8   price              3278 non-null   object 
 9   avg_bill           3773 non-null   object 
 10  middle_avg_bill    3112 non-null   float64
 11  middle_coffee_cup  529 non-null    float64
 12  chain              8319 non-null   int64  
 13  seats              8319 non-null   int64  
 14  street             8319 non-null   object 
 15  is_24/7            7792 non-null   object 
dtypes: float64(5), int64(2), object(9)
memory usage: 1.1+ MB
In [35]:
fig=sb.barplot(x=data['category'],y=data['seats']).set(title = 'Кол-во посадочных мест по категориям', xlabel = 'Категории заведений', ylabel = ('Кол-во посадочных мест'));
plt.xticks(rotation=45)
plt.show()

По новому графику мы видим, что опять же лидируют заведения типа "Ресторан" и "Бар,паб", меньше всего посадочных мест в "Кафе".

Соотношение сетевых и не сетевых заведений в датасете.¶

Рассмотрите и изобразите соотношение сетевых и не сетевых заведений в датасете. Каких заведений больше?

In [36]:
chains=data.groupby('chain').agg({'name':'count'}).reset_index()
chains = data.groupby(by=['category', 'chain'], as_index=False).agg(
    count=('name', 'count'))
chains.loc[chains['chain'] == 0, 'chain'] = 'Не сетевое заведение'
chains.loc[chains['chain'] == 1, 'chain'] = 'Сетевое заведение'

fig = go.Figure(data=[go.Pie(labels=chains['chain'], 
                             values=chains['count'],
                             pull = [0.1, 0])])
fig.update_layout(title='Соотношение сетевых и не сетевых заведений', 
                  width=800, 
                  height=600,
                  annotations=[dict(x=1.12, 
                                    y=1.05,
                                    text='Заведения',
                                    showarrow=False)])
fig.show() #

По полученной диаграмме мы видим, что больший процент в датасете составляют не сетевые заведения (61,2%), сетевые заведения составляют 38,8 % во всем датасете.

Категории сетевых заведений.¶

Какие категории заведений чаще являются сетевыми? Исследуйте данные и ответьте на вопрос графиком.

In [37]:
for i in range(len(chains)):
    chains.at[i, 'ratio'] = str(round(
        chains.loc[i]['count']/len(data[data['category'] == chains.loc[i]['category']]), 1) * 100) + '%'
chains
Out[37]:
category chain count ratio
0 бар,паб Не сетевое заведение 587 80.0%
1 бар,паб Сетевое заведение 168 20.0%
2 булочная Не сетевое заведение 99 40.0%
3 булочная Сетевое заведение 156 60.0%
4 быстрое питание Не сетевое заведение 370 60.0%
5 быстрое питание Сетевое заведение 231 40.0%
6 кафе Не сетевое заведение 1586 70.0%
7 кафе Сетевое заведение 769 30.0%
8 кофейня Не сетевое заведение 686 50.0%
9 кофейня Сетевое заведение 711 50.0%
10 пиццерия Не сетевое заведение 301 50.0%
11 пиццерия Сетевое заведение 328 50.0%
12 ресторан Не сетевое заведение 1297 60.0%
13 ресторан Сетевое заведение 717 40.0%
14 столовая Не сетевое заведение 226 70.0%
15 столовая Сетевое заведение 87 30.0%
In [38]:
fig = px.bar(chains.sort_values(by='count', ascending=True), # загружаем данные
                   x='count', 
                   y='category',
                   color='chain', 
                   text='ratio',
                   title='Соотношение сетевых и не сетевых заведений', # указываем заголовок
                   ) # выбираем «полупрозрачный» тип отображения столбцов
fig.update_xaxes(title_text='Кол-во заведений') # подпись для оси X
fig.update_yaxes(title_text='Категория') # подпись для оси Y
fig.show() # выводим график

По графику мы видим, что сетевыми чаще всего являются кафе, рестораны и кофейни. Меньше всего сетевыми заведениями являются столовая.

Топ-15 популярных сетей в Москве.¶

Сгруппируйте данные по названиям заведений и найдите топ-15 популярных сетей в Москве. Под популярностью понимается количество заведений этой сети в регионе. Постройте подходящую для такой информации визуализацию. Знакомы ли вам эти сети? Есть ли какой-то признак, который их объединяет? К какой категории заведений они относятся?

In [39]:
top_chain=(data.query('chain== 1')
          .pivot_table(index=['name','category'],values=['chain'],aggfunc=['count'])
          .reset_index())
top_chain.columns=['name','category','count']
top_chain=top_chain.sort_values(by='count',ascending=False).head(15).reset_index(drop=True)
top_chain
Out[39]:
name category count
0 шоколадница кофейня 117
1 домино'с пицца пиццерия 76
2 додо пицца пиццерия 74
3 one price coffee кофейня 70
4 яндекс лавка ресторан 68
5 cofix кофейня 65
6 prime ресторан 48
7 кофепорт кофейня 42
8 кулинарная лавка братьев караваевых кафе 38
9 теремок ресторан 36
10 cofefest кофейня 31
11 чайхана кафе 26
12 буханка булочная 25
13 drive café кафе 24
14 кофемания кофейня 21
In [40]:
# Построим столбчатую диаграмму 
fig = px.bar(top_chain.sort_values(by='count', ascending=True),
             x='count', 
             y='name', 
             text='count',
            color='category')

fig.update_layout(title='Топ-15 популярных сетей',
                   xaxis_title='Количество заведений',
                   yaxis_title=' Название сети')
fig.update_layout(yaxis={'categoryorder':'total ascending'})
fig.show() 

Больше всего по кол-ву заведений лидирует "Шоколадница","Домино'с пицца" и "Додо пицца", меньше всего заведений в сети "Кофемания". Все заведения относятся к сетевым.

Административные районы Москвы.¶

Какие административные районы Москвы присутствуют в датасете? Отобразите общее количество заведений и количество заведений каждой категории по районам. Попробуйте проиллюстрировать эту информацию одним графиком.

In [41]:
# Построим таблицу
district=(data.pivot_table(index=['district','category'],values=['name'],aggfunc=['count'])
          .reset_index())
district.columns=['district','category','count']
In [42]:
# Сделаем столбчатую диаграмму
fig = px.bar(district.sort_values(by='count', ascending=True),
             x='count', 
             y='district', 
             text='count',
            color='category')

fig.update_layout(title='Распределение заведений по районам Москвы',
                   xaxis_title='Количество заведений',
                   yaxis_title='Район')
fig.update_layout(yaxis={'categoryorder':'total ascending'})
fig.show() 

По графику мы видим, что больше всего заведений находятся в Центральном административном округе, большую часть из них составляют рестораны, кафе, кофейни и бары. Меньше всего заведений в Северо-Западном округе, там распространены кафе и рестораны.

Распределение средних рейтингов по категориям заведений.¶

Визуализируйте распределение средних рейтингов по категориям заведений. Сильно ли различаются усреднённые рейтинги в разных типах общепита?

In [43]:
data.groupby('category')['rating'].describe().sort_values(by='mean',ascending=False)
Out[43]:
count mean std min 25% 50% 75% max
category
бар,паб 755.0 4.390199 0.380192 1.1 4.3 4.4 4.6 5.0
пиццерия 629.0 4.300636 0.336618 1.0 4.2 4.3 4.4 5.0
ресторан 2014.0 4.289921 0.414782 1.0 4.2 4.3 4.5 5.0
кофейня 1397.0 4.277452 0.373629 1.4 4.1 4.3 4.4 5.0
булочная 255.0 4.267843 0.386975 1.3 4.2 4.3 4.4 5.0
столовая 313.0 4.211821 0.455614 1.0 4.1 4.3 4.4 5.0
кафе 2355.0 4.123609 0.567547 1.0 4.0 4.2 4.4 5.0
быстрое питание 601.0 4.049584 0.561757 1.1 3.9 4.2 4.3 5.0
In [44]:
data_rating=data.groupby(['category'],as_index=False).agg({'rating':'mean'}).sort_values(by='rating',ascending=False)
In [45]:
fig = px.histogram(data_rating, # загружаем данные
                   x='category', 
                   y='rating',
                   nbins=50,
                   title='Распределение средних рейтингов по категориям заведений', # указываем заголовок
                   ) # выбираем «полупрозрачный» тип отображения столбцов
fig.update_xaxes(title_text='Категории заведений') # подпись для оси X
fig.update_yaxes(title_text='Рейтинг') # подпись для оси Y
fig.show() # выводим график

По полученным исследованиям и графику, мы видим, что наибольший рейтинг среди всех заведений имеют бары, пабы (средний рейтинг 4.3),наименьший рейтинг имеют заведения категории "быстрое питание". Усредненные рейтингы не сильно различаются, около 4.2-4.3.

Фоновая картограмму (хороплет) со средним рейтингом заведений каждого района.¶

Постройте фоновую картограмму (хороплет) со средним рейтингом заведений каждого района.

In [46]:
rating_data = data.groupby('district', as_index=False)['rating'].agg('median').sort_values(by='rating',ascending=False)
rating_data
Out[46]:
district rating
5 Центральный административный округ 4.4
0 Восточный административный округ 4.3
1 Западный административный округ 4.3
2 Северный административный округ 4.3
4 Северо-Западный административный округ 4.3
7 Юго-Западный административный округ 4.3
8 Южный административный округ 4.3
3 Северо-Восточный административный округ 4.2
6 Юго-Восточный административный округ 4.2
In [47]:
import json
# импортируем карту и хороплет
from folium import Map, Choropleth

# загружаем JSON-файл с границами округов Москвы
state_geo = 'https://code.s3.yandex.net/data-analyst/admin_level_geomap.geojson'
    
# moscow_lat - широта центра Москвы, moscow_lng - долгота центра Москвы
moscow_lat, moscow_lng = 55.751244, 37.618423

# создаём карту Москвы
m = Map(location=[moscow_lat, moscow_lng], zoom_start=9)

# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
    geo_data=state_geo,
    data=rating_data,
    columns=['district', 'rating'],
    key_on='feature.name',
    fill_color='PuBu',
    fill_opacity=0.5,
    legend_name='Средний рейтинг заведений по районам',
).add_to(m)

# выводим карту
m
Out[47]:
Make this Notebook Trusted to load map: File -> Trust Notebook

По карте, мы можем отметить, что самый высокий рейтинг имеют заведения, которые находятся в Центральном административном округе. Наименьший рейтинг имеют заведения в Северо-Восточном и Юго-Восточном административных округах.

Отображение всех заведений датасета на карте.¶

Отобразите все заведения датасета на карте с помощью кластеров средствами библиотеки folium.

In [48]:
a = Map(location=[moscow_lat, moscow_lng], zoom_start=9)

marker_cluster = MarkerCluster().add_to(a)

def create_clusters(row):

    icon_url = 'https://img.icons8.com/external-wanicon-flat-wanicon/344/external-mall-shop-and-store-wanicon-flat-wanicon.png'  
    icon = CustomIcon(icon_url, icon_size=(30, 30))
    
    # создаём маркер с иконкой icon и добавляем его в кластер
    Marker(
        [row['lat'], row['lng']],
        popup=f"{row['name']} {row['rating']}",
        icon=icon,
    ).add_to(marker_cluster)

# применяем функцию для создания кластеров к каждой строке датафрейма
data.apply(create_clusters, axis=1)

# выводим карту
a
Out[48]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Топ-15 улиц по количеству заведений.¶

Найдите топ-15 улиц по количеству заведений. Постройте график распределения количества заведений и их категорий по этим улицам. Попробуйте проиллюстрировать эту информацию одним графиком.

In [49]:
street_top=data.pivot_table(index='street',values='name',aggfunc='count').sort_values(by='name',ascending=False).head(15)
street_top1 = data[data['street'].isin(street_top.index)].groupby(['street', 'category']).count()['name'].reset_index()
street_top1
Out[49]:
street category name
0 Варшавское шоссе бар,паб 6
1 Варшавское шоссе быстрое питание 7
2 Варшавское шоссе кафе 18
3 Варшавское шоссе кофейня 14
4 Варшавское шоссе пиццерия 4
... ... ... ...
106 улица Миклухо-Маклая быстрое питание 4
107 улица Миклухо-Маклая кафе 20
108 улица Миклухо-Маклая кофейня 4
109 улица Миклухо-Маклая пиццерия 2
110 улица Миклухо-Маклая ресторан 14

111 rows × 3 columns

In [50]:
fig = px.bar(street_top1.sort_values(by='name', ascending=True),
             x='name', 
             y='street', 
             text='name',
            color='category')

fig.update_layout(title='Распределение заведений по улицам',
                   xaxis_title='Количество заведений',
                   yaxis_title='Улица')
fig.update_layout(yaxis={'categoryorder':'total ascending'})
fig.show()

По полученному графику, мы видим, что больше всего заведений находятся на улице проспекта Мира, там большую долю составляют кафе, ресторан и кофейня,также популярны ул. Профсоюзной. пр. Вернадского и Ленинский пр. Меньше же всего заведений на улице Миклухо-Маклая, там больше всего находятся кафе и рестораны.

Улицы, на которых находится только один объект общепита.¶

Найдите улицы, на которых находится только один объект общепита. Что можно сказать об этих заведениях?

In [51]:
cafe_1= data.groupby('street').agg(count=('name', 'count')).sort_values(
    'count', ascending=False).query('count == 1').index.tolist()
cafe_street = data[data['street'].isin(cafe_1)].groupby(
    'category', as_index=False).agg(count=('name', 'count')).sort_values('count', ascending=False)
cafe_street['total']=cafe_street['count'].sum()
cafe_street
Out[51]:
category count total
3 кафе 160 459
6 ресторан 93 459
4 кофейня 85 459
0 бар,паб 39 459
7 столовая 36 459
2 быстрое питание 23 459
5 пиццерия 15 459
1 булочная 8 459
In [52]:
fig=go.Figure(data=[go.Pie(labels=cafe_street['category'],values=cafe_street['count'])])
fig.update_layout(title='Соотношение категорий заведений на улицах')
fig.show()

На улицах, на которых находится только 1 объект общепита,чаще всего этот объект относится к категориям "Кафе","Ресторан" и "Кофейня". Такие заведения как булочная, бар, пиццерия и быстрое питание, скорее всего открываются там, где большой поток клиентов.

Медиана средних чеков для каждого района.¶

Значения средних чеков заведений хранятся в столбце middle_avg_bill. Эти числа показывают примерную стоимость заказа в рублях, которая чаще всего выражена диапазоном. Посчитайте медиану этого столбца для каждого района. Используйте это значение в качестве ценового индикатора района. Постройте фоновую картограмму (хороплет) с полученными значениями для каждого района. Проанализируйте цены в центральном административном округе и других. Как удалённость от центра влияет на цены в заведениях?

In [53]:
avg_bill=data.groupby('district', as_index=False)['middle_avg_bill'].agg('mean').sort_values(by='middle_avg_bill',ascending=False)
avg_bill['middle_avg_bill'] = round(avg_bill['middle_avg_bill'], 2)
avg_bill
Out[53]:
district middle_avg_bill
5 Центральный административный округ 1193.93
1 Западный административный округ 1038.59
2 Северный административный округ 923.57
8 Южный административный округ 834.40
4 Северо-Западный административный округ 822.22
0 Восточный административный округ 815.61
7 Юго-Западный административный округ 792.71
3 Северо-Восточный административный округ 716.61
6 Юго-Восточный административный округ 651.01
In [54]:
# создаём карту Москвы
moscow = Map(location=[moscow_lat, moscow_lng], zoom_start=9)

# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
    geo_data=state_geo,
    data=avg_bill,
    columns=['district', 'middle_avg_bill'],
    key_on='feature.name',
    fill_color='RdPu',
    fill_opacity=0.5,
    legend_name='Средний чек заведений по районам',
).add_to(moscow)

# выводим карту
moscow
Out[54]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Ожидаемо, самый высокий средний чек находится в Центральном административном округе и в Западном административном округе, меньший чек находится в Юго-Восточном административном округе. В целом, отдаленность от центра сильно влияет на средний чек. Меньшие чеки на восточном направлении Москвы, более дорогие чеки на Севере Москвы.

Вывод по наблюдениям.¶

  1. Больше всего в данных заведений категории "Кафе" и "Ресторан" и "Кофейня", меньше всего заведений категорий "Столовая" и "Булочная".
  2. В среднем больше всего посадочных мест в заведениях категорий "Ресторан" и "Бар, паб", меньше всего мест в "Кафе".
  3. Больший процент в датасете составляют не сетевые заведения (61,2%), сетевые заведения составляют 38,8 % во всем датасете.
  4. Самые популярные заведения сетевые, категории в них :кофейня, кафе, ресторан, пиццерия и булочная. Меньше всего сетевыми являются столовые.
  5. Среди сетевых заведений лидирует "Шоколадница","Домино'с пицца" и "Додо пицца", меньше всего заведений в сети "Кофемания". Все заведения относятся к сетевым.
  6. Больше всего заведений находятся в Центральном административном округе, большую часть из них составляют рестораны, кафе, кофейни и бары. Меньше всего заведений в Северо-Западном округе, там распространены кафе и рестораны.
  7. Наибольший рейтинг среди всех заведений имеют бары, пабы (средний рейтинг 4.3),наименьший рейтинг имеют заведения категории "быстрое питание". Усредненные рейтингы не сильно различаются, около 4.2-4.3.
  8. Самый высокий рейтинг имеют заведения, которые находятся в Центральном административном округе. Наименьший рейтинг имеют заведения в Северо-Восточном и Юго-Восточном административных округах.
  9. Больше всего заведений находятся на улице проспекта Мира, там большую долю составляют кафе, ресторан и кофейня,также популярны ул. Профсоюзной. пр. Вернадского и Ленинский пр. Меньше же всего заведений на улице Миклухо-Маклая, там больше всего находятся кафе и рестораны.
  10. На улицах, на которых находится только 1 объект общепита,чаще всего этот объект относится к категориям "Кафе","Ресторан" и "Кофейня". Такие заведения как булочная, бар, пиццерия и быстрое питание, скорее всего открываются там, где большой поток клиентов.
  11. Самый высокий средний чек находится в Центральном административном округе и в Западном административном округе, меньший чек находится в Юго-Восточном административном округе. В целом, отдаленность от центра сильно влияет на средний чек. Меньшие чеки на восточном направлении Москвы, более дорогие чеки на Севере Москвы.

Детализация исследования: открытие кофейни.¶

Основателям фонда «Shut Up and Take My Money» не даёт покоя успех сериала «Друзья». Их мечта — открыть такую же крутую и доступную, как «Central Perk», кофейню в Москве. Будем считать, что заказчики не боятся конкуренции в этой сфере, ведь кофеен в больших городах уже достаточно. Попробуйте определить, осуществима ли мечта клиентов.

Количество кофеен в датасете.¶

Сколько всего кофеен в датасете? В каких районах их больше всего, каковы особенности их расположения?

In [55]:
coffee = data.query('category == "кофейня"')
coffee.groupby('category', as_index=False)['district'].agg('count').sort_values(by='district',ascending=False)
Out[55]:
category district
0 кофейня 1397
In [56]:
coffee_district = coffee.groupby('district')\
    .agg({'rating':'mean','name':'count', 'middle_coffee_cup':'mean' })\
    .reset_index().sort_values(by='name',ascending=False)
coffee_district['rating'] = coffee_district['rating'].round(2)
coffee_district
Out[56]:
district rating name middle_coffee_cup
5 Центральный административный округ 4.34 425 187.518519
2 Северный административный округ 4.29 186 166.338028
3 Северо-Восточный административный округ 4.22 159 165.333333
1 Западный административный округ 4.19 146 188.562500
8 Южный административный округ 4.23 131 158.488372
0 Восточный административный округ 4.28 104 174.023810
7 Юго-Западный административный округ 4.29 95 184.176471
6 Юго-Восточный административный округ 4.23 89 151.088235
4 Северо-Западный административный округ 4.33 62 165.523810
In [57]:
fig=sb.barplot(x=coffee_district['name'],y=coffee_district['district']).set(title = 'Кол-во кофеен по районам', xlabel = 'Кол-во кофеен', ylabel = 'Район Москвы');
plt.xticks(rotation=45)
plt.show()
In [58]:
# создаём карту Москвы
moscow_coffee = Map(location=[moscow_lat, moscow_lng], zoom_start=9)

# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
    geo_data=state_geo,
    data=coffee_district,
    columns=['district', 'name'],
    key_on='feature.name',
    fill_color='RdPu',
    fill_opacity=0.5,
    legend_name='Кол-во кофеен по районам',
).add_to(moscow_coffee)

# выводим карту
moscow_coffee
Out[58]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Всего кофеен в датасете 1397.По карте и барплоту мы можем отметить, что больше всего кофеен находятся в ЦАО,меньше всего в СЗАО.

Круглосуточные кофейни.¶

Есть ли круглосуточные кофейни?

In [59]:
# Построим таблицу для дальнейшего исследования
coffee_noc=coffee.groupby(by=['district', 'is_24/7'], as_index=False).agg(count=('name', 'count')).sort_values(by='count',ascending=False)
coffee_noc
Out[59]:
district is_24/7 count
10 Центральный административный округ False 397
4 Северный административный округ False 179
6 Северо-Восточный административный округ False 154
2 Западный административный округ False 135
16 Южный административный округ False 129
0 Восточный административный округ False 96
12 Юго-Восточный административный округ False 87
14 Юго-Западный административный округ False 86
8 Северо-Западный административный округ False 60
11 Центральный административный округ True 26
3 Западный административный округ True 9
15 Юго-Западный административный округ True 7
5 Северный административный округ True 5
1 Восточный административный округ True 5
7 Северо-Восточный административный округ True 3
9 Северо-Западный административный округ True 2
13 Юго-Восточный административный округ True 1
17 Южный административный округ True 1
In [60]:
fig = px.bar(coffee_noc, # загружаем данные
                   x='count', 
                   y='district',
                   color='is_24/7', 
                   text='count',
                   title='Кол-во круглосуточных кофеен по районам', # указываем заголовок
                   ) # выбираем «полупрозрачный» тип отображения столбцов
fig.update_xaxes(title_text='Кол-во круглосуточных кофеен') # подпись для оси X
fig.update_yaxes(title_text='Район') # подпись для оси Y
fig.show() # выводим график

Всего круглосуточных кофеен - 59.Ожидаемо, что самое большое кол-во круглосуточных кофеен находятся в ЦАО (26 штук). Меньше всего в ЮАО и ЮВАО.

Рейтинги по районам.¶

Какие у кофеен рейтинги? Как они распределяются по районам?

In [61]:
coffee_rat=coffee.groupby('district')\
    .agg({'rating':'mean','name':'count' })\
    .reset_index().sort_values(by='rating',ascending=False)
coffee_rat['rating'] = coffee_rat['rating'].round(2)
coffee_rat
Out[61]:
district rating name
5 Центральный административный округ 4.34 425
4 Северо-Западный административный округ 4.33 62
2 Северный административный округ 4.29 186
7 Юго-Западный административный округ 4.29 95
0 Восточный административный округ 4.28 104
8 Южный административный округ 4.23 131
6 Юго-Восточный административный округ 4.23 89
3 Северо-Восточный административный округ 4.22 159
1 Западный административный округ 4.19 146
In [62]:
moscow_rat = Map(location=[moscow_lat, moscow_lng], zoom_start=9)

# создаём хороплет с помощью конструктора Choropleth и добавляем его на карту
Choropleth(
    geo_data=state_geo,
    data=coffee_rat,
    columns=['district', 'rating'],
    key_on='feature.name',
    fill_color='RdPu',
    fill_opacity=0.5,
    legend_name='Рейтинг кофеен по районам',
).add_to(moscow_rat)

# выводим карту
moscow_rat
Out[62]:
Make this Notebook Trusted to load map: File -> Trust Notebook

По карте мы также видим, что наибольший рейтинг имеют кофейни, расположенные в ЦАО, СЗАО и САО. Самый низкий рейтинг имеют кофейни в ЗАО.

Cтоимость чашки капучино.¶

На какую стоимость чашки капучино стоит ориентироваться при открытии и почему?

In [63]:
cafe_rating_cost = coffee.groupby(by='district', as_index=False).agg(avg_cup=('middle_coffee_cup', 'median'))
cafe_rating_cost['avg_cup'] = round(cafe_rating_cost['avg_cup'])
cafe_rating_cost.sort_values(by='avg_cup',ascending=False)
Out[63]:
district avg_cup
7 Юго-Западный административный округ 198.0
5 Центральный административный округ 190.0
1 Западный административный округ 187.0
4 Северо-Западный административный округ 165.0
3 Северо-Восточный административный округ 162.0
2 Северный административный округ 159.0
8 Южный административный округ 150.0
6 Юго-Восточный административный округ 148.0
0 Восточный административный округ 135.0
In [64]:
fig = px.bar(cafe_rating_cost.sort_values(by='avg_cup',ascending=True), # загружаем данные
                   x='avg_cup', 
                   y='district', 
                   text='avg_cup',
                   title='Стоимость чашки кофе по районам', # указываем заголовок
                   ) # выбираем «полупрозрачный» тип отображения столбцов
fig.update_xaxes(title_text='Средняя стоимость') # подпись для оси X
fig.update_yaxes(title_text='Район') # подпись для оси Y
fig.show()

Неожиданно, самый дорогой кофе будет в ЮЗАО, далее будет ЦАО и ЗАО. Самый дешевый кофе будет в ЮВАО и в ВАО.

Рекомендации¶

Средняя стоимость чашки кофе.

In [65]:
coffee['middle_coffee_cup'].mean()
Out[65]:
175.0640776699029

Выводы по кофейням:

  1. Всего кофеен в Москве 1397. Больше всего кофеен в ЦАО, САО и СВАО. Меньше всего кофеен в ЮЗАО, ЮВАО и СЗАО.
  2. Круглосуточные кофейни распространены в ЦАО, ЗАО и ЮЗАО. Меньше всего в СЗАО, ЮВАО, ЮАО.
  3. Самые высокие рейтинги кофеен в ЦАО, СЗАО, ЮЗАО и САО. Низкие рейтинги в СВАО и ЗАО.
  4. Стоимость чашек в ЮЗАО (198 р.), ЦАО (190 р.), ЗАО (187 р.). Средняя стоимость чашки кофе (175 р.)

Рекомендации:

Без дополнительных данных о стоимости арендных помещений, площади аренды, проходимости людей и прочих данных, мы можем сделать выводы только по наших данным.

Если смотреть по районам, меньше всего кофеен в 3 районах (ЮЗАО, ЮВАО и СЗАО), среди этих районах в районах СЗАО и ЮВАО меньше всего круглосуточных кофеен. В районах ЮЗАО и СЗАО самые высокие рейтинги кофеен.

Если открывать дневную кофейню можно рассмотреть район ЮЗАО, если же смотреть круглосуточную кофейню, можно рассмотреть также район СЗАО, стоимость чашки около 175 - 180 рублей.

Презентация¶

Презентация: https://disk.yandex.ru/i/G_LspknE36RH9A